home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / raytrace / renaisnc / lib.lha / Lib / fast.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-01-04  |  1.3 KB  |  48 lines

  1.  
  2. /*
  3. **  File: fast.c
  4. */
  5.  
  6. #define Entry(M1,M2,i,j) (M1).T[0][j]*(M2).T[i][0] + \
  7.                    (M1).T[1][j]*(M2).T[i][1] + \
  8.                    (M1).T[2][j]*(M2).T[i][2] + \
  9.                    (M1).T[3][j]*(M2).T[i][3] 
  10. #define TxT4Dm(M,M1,M2)  \
  11.     (M).T[0][0] = Entry((M1),(M2),0,0); \
  12.     (M).T[0][1] = Entry((M1),(M2),0,1); \
  13.     (M).T[0][2] = Entry((M1),(M2),0,2); \
  14.         (M).T[0][3] = Entry((M1),(M2),0,3); \
  15.                             \
  16.     (M).T[1][0] = Entry((M1),(M2),1,0); \
  17.     (M).T[1][1] = Entry((M1),(M2),1,1); \
  18.     (M).T[1][2] = Entry((M1),(M2),1,2); \
  19.         (M).T[1][3] = Entry((M1),(M2),1,3); \
  20.                                 \
  21.     (M).T[2][0] = Entry((M1),(M2),2,0); \
  22.     (M).T[2][1] = Entry((M1),(M2),2,1); \
  23.     (M).T[2][2] = Entry((M1),(M2),2,2); \
  24.         (M).T[2][3] = Entry((M1),(M2),2,3); \
  25.                                 \
  26.     (M).T[3][0] = Entry((M1),(M2),3,0); \
  27.     (M).T[3][1] = Entry((M1),(M2),3,1); \
  28.     (M).T[3][2] = Entry((M1),(M2),3,2); \
  29.         (M).T[3][3] = Entry((M1),(M2),3,3) 
  30.  
  31. #define EntryP(Q,M,i) \
  32.   ((Q).P[0]*(M).T[i][0] + (Q).P[1]*(M).T[i][1] +  \
  33.    (Q).P[2]*(M).T[i][2] + (Q).P[3]*(M).T[i][3])
  34.  
  35. #define PxT4Dm(Q1,Q2,M) \
  36.   (Q1).P[0] = EntryP(Q2,M,0);\
  37.   (Q1).P[1] = EntryP(Q2,M,1);\
  38.   (Q1).P[2] = EntryP(Q2,M,2);\
  39.   (Q1).P[3] = EntryP(Q2,M,3);
  40.   
  41. #define RayxT4Dm(Rout,Rin,M) \
  42.   PxT4Dm(Rout.P0,Rin.P0,M); \
  43.   PxT4Dm(Rout.P1,Rin.P1,M);
  44.   
  45.  
  46.  
  47.  
  48.